ansible.cnfでssh_configを設定する
渡辺です。
2015年はAnsible盛り上がってますね。 大規模な構成管理ツールとしては疑問の声も聞こえてきたりしますが、弊社のAWS環境構築支援のように、ある程度お決まりの設定をサクっと8分組みしたいようなケースでは本当に便利です。
そんなAnsibleが手軽に使える最大の理由は、Ansibleがエージェントレスで、対象サーバにSSH接続が可能ならば利用できるという点であることは言うまでもありません。 この辺りもAWSの環境構築とAnsibleの親和性が高い理由のひとつです。 今回のエントリーでは、そんなAWSの環境構築を行う時に、ssh_confとAnsibleを組み合わせる方法を紹介します。
SSH接続と秘密鍵
Ansibleを実行するマシンから対象のサーバにはSSH接続を行う必要があります。 すなわち、秘密鍵が必要です(鍵認証無しでSSH可能な環境は論外で...)。 秘密鍵は、sshコマンドを利用する場合はiオプションで、ansible(ansible-playbook)コマンドを実行する場合はprivate-keyオプションで指定します。
# ssh -i ~/.ssh/key.pem ec2-user@xxx.xxx.xxx.xxx # ansible-playbook --private-key=~/.ssh/key.pem -i hosts site.yml
このように秘密鍵の指定は面倒ですが、sshコマンドの場合は、~/.ssh/configにホストの設定を追記することで、簡略化できます。 また、IPアドレスではなく論理ホスト名を利用できるようになることも大切ですね。
Host xxx.web1a User ec2-user HostName xxx.xxx.xxx.xxx IdentityFile ~/.ssh/key.pem
# ssh xxx.web1a
しかし、AWSなどを利用していて管理する環境が多くなってくると、~/.ssh/configが肥大化しがちです。
ssh_configの準備
sshの設定ファイルは、デフォルトで~/.ssh/configが利用されますが、コマンドにFオプションで指定することもできます。 このため、プロジェクト(環境)毎にssh_configファイルを作成する方針とします。 Ansibleのプロジェクトディレクトリにssh_configを作成してください。
Host xxx.web1a User ec2-user HostName xxx.xxx.xxx.xxx IdentityFile ~/.ssh/key.pem StrictHostKeyChecking no UserKnownHostsFile /dev/null
このファイルをFオプションでsshコマンドに指定します。
# ssh -F ssh_config xxx.web1a
このssh_configは、勿論SSH接続をするときに便利に利用できますが、Ansibleを利用するのにも有効です。
なお、EC2(AWS)の場合、ホスト名やIPアドレスは変わらなくとも、サーバの実体(インスタンス)が変更されるケースは多々あるので注意してください(このため、StrictHostKeyCheckingやUserKnownHostsFileの設定を行っています)。
ansible.cnfでssh_configを指定する
ansible.cnfはAnsible実行時の設定を保持するiniファイルです。 ansible.cnfのssh_connectionセクションのssh_argsには、Ansibleがssh接続を行う時のオプションを指定できます。 ここにFオプションを記述してください。
[ssh_connection] ssh_args = -F ssh_config
これでAnsibleを実行する時に、実行ディレクトリのssh_configが有効になります。 すなわち、秘密鍵の指定や接続ユーザの設定が不要になり、ホスト名も論理ホスト名で解決できるようになります。
inventoryファイル
ssh_configが有効になっていることを前提とするならば、対象サーバを記述するinventoryファイルは、論理ホスト名で設定できます。
[web] xxx.web1a xxx.web2a xxx.web1c xxx.web2c [batch] xxx.batch
Ansible Playbookの実行 Ansibleを実行する時は、private-keyオプションは指定する必要がありません。
# ansible-playbook -i hosts site.yml
また、Ansibleのリモートユーザもssh_configで解決されるため、playbookファイルのremote_userの指定も不要です。
- hosts: all sudo: True # remote_user: ec2-user roles: - system/lang - system/timezone
多段SSHの解決
Ansibleで構成管理するサーバへのアクセスで踏み台サーバ必要とする場合も、ssh_configに設定を記述しておけばAnsibleで解決できます。 多段SSHの設定については、多段SSHをAnsibleで設定するを参照ください。
まとめ
プロジェクト毎にssh_configを作成し、論理ホスト名でSSHの接続設定を解決できるようにしてください。 Ansibleの実行時には、ansible.cfgでssh_connectionのssh_argsを指定し、ssh_configを有効にしましょう。 勿論、ssh_configはサーバに接続して確認をするときにも利用できます。